"""
**股票价格数据查询**：
提供从本地JSONL文件中读取指定股票在特定日期的OHLCV（开盘价、最高价、最低价、收盘价和成交量）数据的功能。

**服务启动**：
如果直接运行此文件，会启动一个HTTP服务，默认监听在8003端口，通过FastMCP提供价格查询服务

这个工具主要用于AI-Trader项目中，为交易智能体提供本地历史股票价格数据的访问接口，避免频繁调用外部API。
"""
from pathlib import Path
import json
from datetime import datetime
from typing import Dict, Any
from fastmcp import FastMCP
import os
from dotenv import load_dotenv
load_dotenv()

mcp = FastMCP("LocalPrices")


def _workspace_data_path(filename: str) -> Path:
    """获取工作空间中数据文件的路径"""
    base_dir = Path(__file__).resolve().parents[1]
    return base_dir / "data" / filename


def _validate_date(date_str: str) -> None:
    """验证日期格式是否正确"""
    try:
        datetime.strptime(date_str, "%Y-%m-%d")
    except ValueError as exc:
        raise ValueError("日期必须为YYYY-MM-DD格式") from exc


@mcp.tool()
def get_price_local(symbol: str, date: str) -> Dict[str, Any]:
    """读取指定股票和日期的OHLCV(开盘价、最高价、最低价、收盘价、成交量)数据。获取指定股票在特定日期的历史价格信息。

    参数:
        symbol: 股票代码，例如 'IBM' 或 '600243'。
        date: 日期，格式为 'YYYY-MM-DD'。

    返回:
        包含股票代码、日期和OHLCV数据的字典。
    """
    filename = "merged.jsonl"
    try:
        _validate_date(date)
    except ValueError as e:
        return {"error": str(e), "symbol": symbol, "date": date}

    data_path = _workspace_data_path(filename)
    if not data_path.exists():
        return {"error": f"数据文件未找到: {data_path}", "symbol": symbol, "date": date}

    with data_path.open("r", encoding="utf-8") as f:
        for line in f:
            if not line.strip():
                continue
            doc = json.loads(line)
            meta = doc.get("Meta Data", {})
            if meta.get("2. Symbol") != symbol:
                continue
            series = doc.get("Time Series (Daily)", {})
            day = series.get(date)
            if day is None:
                sample_dates = sorted(series.keys(), reverse=True)[:5]
                return {
                    "error": f"未找到日期 {date} 的数据。请验证该日期是否存在于数据中。可用日期样本: {sample_dates}",
                    "symbol": symbol,
                    "date": date
                }
            return {
                "symbol": symbol,
                "date": date,
                "ohlcv": {
                    "open": day.get("1. buy price"),
                    "high": day.get("2. high"),
                    "low": day.get("3. low"), 
                    "close": day.get("4. sell price"),
                    "volume": day.get("5. volume"),
                },
            }

    return {"error": f"在本地数据中未找到股票 {symbol} 的记录", "symbol": symbol, "date": date}



def get_price_local_function(symbol: str, date: str, filename: str = "merged.jsonl") -> Dict[str, Any]:
    """从本地JSONL数据中读取指定股票和日期的OHLCV数据。

    参数:
        symbol: 股票代码，例如 'IBM' 或 '600243.SHH'。
        date: 日期，格式为 'YYYY-MM-DD'。
        filename: 数据文件名，默认为 'merged.jsonl'（位于项目根目录下的data/文件夹中）。

    返回:
        包含股票代码、日期和OHLCV数据的字典。
    """
    try:
        _validate_date(date)
    except ValueError as e:
        return {"error": str(e), "symbol": symbol, "date": date}

    data_path = _workspace_data_path(filename)
    if not data_path.exists():
        return {"error": f"数据文件未找到: {data_path}", "symbol": symbol, "date": date}

    with data_path.open("r", encoding="utf-8") as f:
        for line in f:
            if not line.strip():
                continue
            doc = json.loads(line)
            meta = doc.get("Meta Data", {})
            if meta.get("2. Symbol") != symbol:
                continue
            series = doc.get("Time Series (Daily)", {})
            day = series.get(date)
            if day is None:
                sample_dates = sorted(series.keys(), reverse=True)[:5]
                return {
                    "error": f"未找到日期 {date} 的数据。请验证该日期是否存在于数据中。可用日期样本: {sample_dates}",
                    "symbol": symbol,
                    "date": date
                }
            return {
                "symbol": symbol,
                "date": date,
                "ohlcv": {
                    "buy price": day.get("1. buy price"),
                    "high": day.get("2. high"),
                    "low": day.get("3. low"),
                    "sell price": day.get("4. sell price"),
                    "volume": day.get("5. volume"),
                },
            }

    return {"error": f"在本地数据中未找到股票 {symbol} 的记录", "symbol": symbol, "date": date}

if __name__ == "__main__":
    # 打印测试用例
    # print(get_price_local_function("AAPL", "2025-10-16"))
    port = int(os.getenv("GETPRICE_HTTP_PORT", "8003"))
    mcp.run(transport="streamable-http", port=port)

